home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 9 / FM Towns Free Software Collection 9.iso / t_os / tool / tetujin / src / g_eff / smple00.c < prev    next >
Text File  |  1994-11-16  |  1KB  |  55 lines

  1. #include "smple00.h"
  2.  
  3. g_softnessFilter( BASICPARA *para, int rate )
  4. {
  5.     unsigned char a[10][4] ;
  6.     int i, x, y, k1, k2, total ;
  7.  
  8.     int cMax, x1, y1, x2, y2 ;    /* 引数を記憶する変数 */
  9.     int (*read1)() ;
  10.     int (*write)() ;
  11.  
  12.     /* 引数を記憶 */
  13.     cMax = para->colorMax ;        /* RGBデータの最大値 */
  14.     x1 = para->lupx ;            /* 領域の対角座標 */
  15.     y1 = para->lupy ;
  16.     x2 = para->rdwx ;
  17.     y2 = para->rdwy ;
  18.     read1 = para->read1 ;        /* アンドゥバッファ読込関数 */
  19.     write = para->write ;        /* メインバッファ書込関数 */
  20.  
  21.     k1 = rate >> 3 ;        /* オペレータの係数の設定 */
  22.     k2 = 256 - k1*8 ;
  23.  
  24.     for( y = y1 ; y <= y2 ; y++ )
  25.     {
  26.         for( x=x1 ; x <= x2 ; x++ )
  27.         {
  28.             read1( x-1, y-1, a[0] ) ;    /* アンドゥバッファ */
  29.             read1( x,   y-1, a[1] ) ;    /* 3×3ドット */
  30.             read1( x+1, y-1, a[2] ) ;    /* データ読込 */
  31.             read1( x-1, y,   a[3] ) ;
  32.             read1( x,   y,   a[4] ) ;
  33.             read1( x+1, y,   a[5] ) ;
  34.             read1( x-1, y+1, a[6] ) ;
  35.             read1( x,   y+1, a[7] ) ;
  36.             read1( x+1, y+1, a[8] ) ;
  37.  
  38.             for( i=0 ; i<3 ; i++ )    /* RGBを3回にわけて計算 */
  39.             {
  40.                 /* たたみ込みの計算 */
  41.                 total = k1*( (int)(a[0][i]) + a[1][i] + a[2][i] +
  42.                                    a[3][i]            + a[5][i] +
  43.                                    a[6][i]  + a[7][i] + a[8][i]
  44.                            ) + k2*( (int)(a[4][i]) ) ;
  45.                 total = (total + 128) >> 8 ;    /* 四捨五入 */
  46.                 if( total < 0 )total = 0 ;        /* リミッター */
  47.                 if( total > cMax )total = cMax ;
  48.                 a[9][i] = total ;    /* a[9]にデータを書込 */
  49.             }
  50.             write( x, y, a[9] ) ;    /* メインバッファに書込 */
  51.         }
  52.     }
  53.     return 0 ;
  54. }
  55.